#include "Container.h"

Container::Container()
{

}

void Container::AddScene(Scene param)
{ //video aan de lijst toevoegen
	Scenelist.push_back(param);
}

void Container::EnableStreams(bool VideoEnabled, bool AudioEnabled)
{
	Encoder.EnableStreams(VideoEnabled, AudioEnabled); //audio & video aanzetten
}

void Container::SetEncoder(char *filename, int bitrate, int den, int num, int gopsize, int width, int height, int sample_rate, int audio_bitrate, int channels, CodecID videoCodec, CodecID audioCodec)
{ //de Encoder opzetten... Hier zal nog Audio opzet info bij moeten komen
	Encoder.SetupEncoder(filename, videoCodec, audioCodec); //fileke bijhouden
	if(Scenelist.size() > 0) //parameteres van de Encoder aanvullen
		Encoder.FillParameters(bitrate, den, num, gopsize, width, height, sample_rate, audio_bitrate, channels); 
	
	Encoder.OpenOutput(); //fileke openen
}

void Container::Process()
{ //The magic Starts Here!
	for(int i = 0; i < Scenelist.size(); i++)
	{	//ga de lijst af
		if(Scenelist[i].IsVideoEnabled())// als er video is, stel scale parameters in
			Encoder.SetConvertParameters(Scenelist[i].GetVideoCodecContext()); 
		Encoder.FifoInitialise(); // maak aan & initialiseer de AudioFIFO buffer

		if(!Scenelist[i].IsVideoEnabled() && Scenelist[i].Delayed() && Encoder.IsVideoEnabled())  
			Encoder.FillBlankVideo(Scenelist[i].GetEnd()-Scenelist[i].GetBegin());//lege video adden
		if(!Scenelist[i].IsAudioEnabled() && Scenelist[i].Delayed() && Encoder.IsAudioEnabled())
			Encoder.FillBlankAudio(Scenelist[i].GetEnd()-Scenelist[i].GetBegin());// lege audio adden

		while ( av_read_frame( Scenelist[i].GetAVFormatContext(), &packet ) >= 0 ) //lees in
		{
			if (packet.stream_index == Scenelist[i].GetVideoStreamIndex() && Encoder.IsVideoEnabled() 
				&& Scenelist[i].IsVideoEnabled()) 
			{ //als het packet een video is Decode & dan encode
				frame = Scenelist[i].DecodeVideo(packet);
				if(frame != NULL) //als er kon gedecodeerd worden & tussen de juiste fragmenten behoort
					Encoder.EncodeVideo(frame);
			}
			else if (packet.stream_index == Scenelist[i].GetAudioStreamIndex() && Encoder.IsAudioEnabled() 
				&& Scenelist[i].IsAudioEnabled()) 
			{ //als het packet audio is, decode & encode
				Scenelist[i].DecodeAudio(packet);
				if(Scenelist[i].IsSample()) //als er kon gedecodeerd worden & tussen de juiste fragmenten behoort
						Encoder.EncodeAudio(Scenelist[i].GetSample(), Scenelist[i].GetBuffersize());
			}
		}
	}
	Encoder.CloseOutput(); //sluit het fileke
}